/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package xmlaufgabe8;

import java.util.ArrayList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

/**
 * Klasse dient zum Parsen des entpackten content.xml Dokuments.
 * Geparste, wichtige Informationen werden zum SimpleTextFormat formatiert
 * und innerhalb eines Strings gespeichert.
 * 
 * @author s0527676
 */
public class ODTContentParser extends DefaultHandler {
    /**
     * Speichert den Inhalt fuer das konvertierte SimpleTextFormat XML Dokument
     */
    private String buffer;
    
    /**
     * Speichert Ortszustand innerhalb des zu parsenden XML Dokuments
     */
    private boolean inHeader;
    
    /**
     * Speichert Ortszustand innerhalb des zu parsenden XML Dokuments
     */
    private boolean inParagraph;
    
    /**
     * Speichert Ortszustand innerhalb des zu parsenden XML Dokuments
     */
    private boolean inNote;
    
    /**
     * Speichert Ortszustand innerhalb des zu parsenden XML Dokuments
     */
    private boolean inNoteParagraph;
    
    /**
     * Speichert Ortszustand innerhalb des zu parsenden XML Dokuments
     */
    private boolean inList;
    
    /**
     * Speichert Ortszustand innerhalb des zu parsenden XML Dokuments
     */
    private boolean inListItem;
    
    /**
     * Speichert Ortszustand innerhalb des zu parsenden XML Dokuments
     */
    private boolean inListStyle;
    
    /**
     * Speichert systemunabhaengigen Zeilenumbruch
     */
    private String newLine;
    
    /**
     * Speichert den Status (nummeriert/unnummeriert) der Listen
     */
    private ArrayList<String> listStyles;
    
    /**
     * Speichert die Anzahl der im XML Dokument vorkommenden Listen
     */
    private int listCounter;
    
    
    /**
     * Standard Konstruktor, initialisiert Felder.
     * 
     */
    public ODTContentParser() {
        newLine = System.getProperty("line.separator");
        this.buffer = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + newLine +
                      "<!DOCTYPE Text SYSTEM \"po.dtd\">" + newLine;
        inHeader = false;
        inParagraph = false;
        inNote = false;
        inNoteParagraph = false;
        inListItem = false;
        listStyles = new ArrayList<String>();
        inListStyle = false;
        listCounter = 0;
        inList = false;
    }
    
    /**
     * Parst in der aktuellen Zeile im XML Dokument nach Starttags, filtert
     * wichtige Informationen heraus, formatiert und speichert diese im buffer-String.
     * Setzt Stati der Ortszustaende.
     * 
     * @param nameSpace Namespace des Tag-Elements
     * @param elementName Elementname des Tag-Elements
     * @param qualifiedName Qualifizierter Name des Tag-Elements
     * @param attribute Attributliste des Tag-Elements
     * @throws SAXException 
     */
    @Override
    public void startElement(String nameSpace, String elementName, String qualifiedName, Attributes attribute) throws SAXException {
        if(inListStyle) {
            listStyles.add(elementName);
            inListStyle = false;
        }
        
        if(elementName.equals("list-style")) {
            if(attribute.getLocalName(0).equals("name")) {
                inListStyle = true;
            }
        }
        
        if(elementName.equals("body")) {
            buffer = getBuffer().concat("<Text>" + newLine);
        }
        
        if(elementName.equals("h")) {
            inHeader = true;
            buffer = getBuffer().concat("<Ueberschrift>");
        }
        
        if(elementName.equals("p") && !inNote && !inListItem) {
            inParagraph = true;
            buffer = getBuffer().concat("<Absatz>");
        }
        
        if(elementName.equals("note")) {
            inNote = true;
        }
        
        if(elementName.equals("list")) {
            if(attribute.getLength() >= 1) {
                inList = true;
                if(listStyles.get(listCounter).equals("list-level-style-number")) {
                    buffer = getBuffer().concat("<Aufzaehlung nummeriert=\"true\">" + newLine);
                } else {
                    buffer = getBuffer().concat("<Aufzaehlung nummeriert=\"false\">" + newLine);
                }
                listCounter++;
            }
            
        }
        
        if(elementName.equals("list-item") && !inListItem) {
            inListItem = true;
            buffer = getBuffer().concat("<Item>");
        }
        
        if(inNote) {
            if(elementName.equals("p")) {
                inNoteParagraph = true;
            }
        }
        
        //System.out.println(elementName);
    }
    
    /**
     * Parst in der aktuellen Zeile im XML Dokument nach Endtags und setzt Stati
     * der Ortszustaende innerhalb des XML Dokuments. Formatiert und speichert
     * Element im buffer-String.
     * 
     * @param nameSpace Namespace des Tag-Elements
     * @param elementName Elementname des Tag-Elements
     * @param qualifiedName Qualifizierter Name des Tag-Elements
     * @throws SAXException 
     */
    @Override
    public void endElement(String nameSpace, String elementName, String qualifiedName) throws SAXException {
        if(elementName.equals("list-style")) {
            inListStyle = false;
        }
        
        if(inHeader) {
            if(elementName.equals("h")) {
                inHeader = false;
                buffer = getBuffer().concat("</Ueberschrift>" + newLine);
            }
        }
        
        if(inParagraph) {
            if(elementName.equals("p")  && !inNote && !inListItem) {
                inParagraph = false;
                buffer = getBuffer().concat("</Absatz>" + newLine);
            }
        }
        
        if(elementName.equals("note")) {
            inNote = false;
        }
        
        if(elementName.equals("body")) {
            buffer = getBuffer().concat("</Text>" + newLine);
        }
        
        if(elementName.equals("list") && inList) {
            inList = false;
            buffer = getBuffer().concat("</Aufzaehlung>" + newLine);
        }
        
        if(elementName.equals("list-item") && inListItem) {
            inListItem = false;
            buffer = getBuffer().concat("</Item>" + newLine);
        }
        
        if(inNote) {
            if(elementName.equals("p")) {
                inNoteParagraph = false;
            }
        }
        //System.out.println(elementName);
    }
    
    /**
     * Parst in der aktuellen Zeile im XML Dokument den Text zwischen Start-
     * und Endtags und speichert und formatiert wichtige Informationen im buffer-String.
     * 
     * @param text Text zwischen Start- und Endtags
     * @param start Startposition des wichtigen Textteils
     * @param length Laenge des Textes
     * @throws SAXException 
     */
    @Override
    public void characters(char[] text, int start, int length) throws SAXException {
        if(inHeader || inParagraph && !inListItem && !inNote) {
            String label = "";
            
            for(int i = 0; i < length; i++) {
                label = label.concat(Character.toString(text[start+i]));
            }
            
            buffer = getBuffer().concat(label);
        }
        
        if(inNoteParagraph) {
            String label = "";
            
            for(int i = 0; i < length; i++) {
                label = label.concat(Character.toString(text[start+i]));
            }
            buffer = getBuffer().concat("(" + label + ")");
        }
        
        if(inListItem) {
            String label = "";
            
            for(int i = 0; i < length; i++) {
                label = label.concat(Character.toString(text[start+i]));
            }
            
            buffer = getBuffer().concat(label);
        }
        
        
    }

    /**
     * @return the buffer
     */
    public String getBuffer() {
        return buffer;
    }
}
